package data;

import java.util.ArrayList;
import java.util.Collections;

import javax.cache.Cache;
import javax.cache.CacheException;
import javax.cache.CacheManager;
import javax.jdo.annotations.NotPersistent;

import models.DomainModel;

public class RecentSiteData {

	private int limit = 50;
	
	private ArrayList<DomainModel> recentSiteUpdate = new ArrayList<DomainModel>();
	
	private ArrayList<String> recentSiteView = new ArrayList<String>();
	
	private String cacheNameUpdate = "recentSiteUpdate";
	
	private String cacheNameView = "recentSiteView";

	private Cache cache = null;
	
	public int getLimit() {
		return limit;
	}

	public void setLimit(int limit) {
		this.limit = limit;
	}
	
	public RecentSiteData() {
		try {
            cache = CacheManager.getInstance().getCacheFactory().createCache(Collections.emptyMap());
        } catch (CacheException e) {
           //e.printStackTrace();
        }
	}
	
	public ArrayList<DomainModel> getRecentSiteUpdate() {
		try {
			if (cache.containsKey(cacheNameUpdate)) {
				recentSiteUpdate = (ArrayList<DomainModel>) cache.get(cacheNameUpdate);
			} else {
				cache.put(cacheNameUpdate, recentSiteUpdate);
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		return recentSiteUpdate;
	}

	public ArrayList<String> getRecentSiteView() {
		try {
			if (cache.containsKey(cacheNameView)) {
				recentSiteView = (ArrayList<String>) cache.get(cacheNameView);
			} else {
				cache.put(cacheNameView, recentSiteView);
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		return recentSiteView;
	}

	public void setRecentUpdate(DomainModel domain) {
		try {
			recentSiteUpdate = getRecentSiteUpdate();
			Boolean exists = false;
			for (int i = 0; i < recentSiteUpdate.size(); i++) {
				if (recentSiteUpdate.get(i).getDomain().equalsIgnoreCase(domain.getDomain())) {
					exists = true;
				}
			}
			
			if (!exists) {
				if (recentSiteUpdate.size() < limit) {
					recentSiteUpdate.add(domain);
				} else {
					recentSiteUpdate.remove(0);
					recentSiteUpdate.add(domain);
				}
			}
			cache.put(cacheNameUpdate, recentSiteUpdate);
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	
	public void setRecentView(String name) {
		try {
			recentSiteView = getRecentSiteView();
			
			if (!recentSiteView.contains(name)) {
				if (recentSiteView.size() < limit) {
					recentSiteView.add(name);
				} else {
					recentSiteView.remove(0);
					recentSiteView.add(name);
				}
			}
			cache.put(cacheNameView, recentSiteView);
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
}
